const express = require(`express`);
const app = express();
const { TOKENPWD } = require(`./util/config`);


// 静态资源托管
app.use(`/uploads`,express.static('uploads'));
// 处理请求报文参数格式
app.use(express.urlencoded());
app.use(express.json());


// 第三方包处理跨域
const cors = require(`cors`);
app.use(cors());

// token验证处理  别的请求也要戴上token 就可以用这个插件
const jwt = require('express-jwt');
app.use(jwt({ 
    secret: TOKENPWD, // 加密的密码要和token生成时的密码保持一致
     algorithms: ['HS256'] // 这个是加密算法，如果不写则报错
    }).unless({
        path: ['/user/register',`/user/login`]  // 排除token验证的路径
    }));

// 导入路由中间件
const heroRouter = require(`./router/hero_router`);
const userRouter = require(`./router/user_router`);

// 导入mysql方法 用中间件挂载到req中
const execSql = require(`./util/sql`);
app.use((req,res,next)=>{
    res.execSql = execSql;
    next();
})


// 使用路由中间件
app.use(`/user`,userRouter);
app.use(`/hero`,heroRouter);

// 判断token验证失败的异常  插件文档上可以看到这个方法
app.use(function (err, req, res, next) {
    
    if (err.name === 'UnauthorizedError') {
      res.status(200).send({code:401,msg:`身份验证失败，请重新验证`});
      return;
    }
    res.send({ code: 500, msg: err.message });
    
  });
app.listen(3001, () => {
  console.log(`3001英雄接口服务器已启动`);
});
